#ifndef __STACK_H__
#define __STACK_H__
#if !defined(WIN32) 
#include <pthread.h>
#else
#include <Windows.h>
#endif

#define STACK_MAX_COUNT 10

typedef struct stack_t{
    void *data_ptr[STACK_MAX_COUNT];//栈数据指针
    int top;//栈首
	int count;//站内元素个数
    int data_size;//每个数据的大小
#if !defined(WIN32) 
    pthread_mutex_t mtx;//互斥锁
#else
	CRITICAL_SECTION   mtx;
#endif
} stack_t;

/*
函数名称：
    init_stack
说明:
    初始化栈
参数:
    stack[in/out]:栈指针
	data_size[in]:栈每个块的内存大小（最好使用sizeof计算）
返回值：
    -1参数错误
    0成功
*/
int init_stack(stack_t * stack,int data_size);
/*
函数名称
    free_stack
说明
    释放栈列资源
参数
    stack[in]:环形队列指针
返回值
    -1参数错误
    0成功
*/
int free_stack(stack_t * stack);
/*
函数名称：
    pop_stack
说明
     数据出队，将数据复制到data指向的存储空间
参数
    stack[in]:栈指针
    data[out]:数据存储取指针
返回值
    -1参数错误
    -2栈为空
    -3失败，栈内存错误
    0 成功
*/
int pop_stack(stack_t * stack,void *data);
/*
函数名称：
    push_stack
说明
     数据入栈，将data指针空间的数据拷贝到栈中
参数
    stack[in]:栈指针
    data[in]:数据指针
返回值
    -1参数错误
    -2栈已满
    -3队列内存错误
    0成功
*/
int push_stack(stack_t * stack,void *data);
/*
函数名称：
    empty_stack
说明
    清空栈的内容
参数
    stack[in]:队列指针
返回值
    -1参数错误
    0 成功
*/
int empty_stack(stack_t * stack);

#endif
